from PyQt5.Qt import *
import matplotlib.pyplot as plt
import sys
from myfun import read_pic,save_pic,show_pic,check_dir
import numpy as np
import time
import os
import cv2
import shutil
from scipy.optimize import curve_fit
from tools import cv_imread, create_dir
from PyQt5.QtGui import QDoubleValidator

plt.style.use('seaborn-dark')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

"""
hl着点画图分段
"""

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("截图小工具")
        self.resize(450, 150)
        self.setup_ui()

    def setup_ui(self):
        self.label1 = QLabel(self)
        self.label1.setText('图片文件夹路径:')
        self.label1.move(25, 27)
        self.label1.setStyleSheet("font-size:12px;color:black")

        self.lineEdit1 = QLineEdit(self)
        self.lineEdit1.move(120, 23)
        self.lineEdit1.resize(300, 25)

        #截图正方形边长
        self.label2 = QLabel(self)
        self.label2.setText("截图正方形边长:")
        self.label2.move(25, 60)

        self.lineEdit2 = QLineEdit("256",self)
        self.lineEdit2.move(120, 54)
        self.lineEdit2.resize(30, 25)

        self.btn = QPushButton(self)
        self.btn.setText("OK")
        self.btn.move(25, 80)

        self.btn.clicked.connect(self.hd)

    def hd(self):
        #拿到两个东西 一个文件夹路径  一个是正方形的边长
        src = self.lineEdit1.text()
        des = src + "结果"
        check_dir(des)
        h=self.lineEdit2.text()
        #print(h,type(h))
        h=int(h)

        #用一个全局变量来存储当前要找的那个图片的索引
        self.i=0
        print('当前的self.i:',self.i)
        #可以这样 先把所有的图片都读进来，放在一个list里面，然后用一个全局变量，用鼠标或者键盘去操作，求找下一张
        picList=[(file,read_pic(src, file)) for file in os.listdir(src)]#(file是文件名,后面是图片矩阵)

        fig, ax = plt.subplots()
        ax.imshow(cv2.cvtColor(picList[self.i][1], cv2.COLOR_BGR2RGB))
        plt.title(picList[self.i][0])
        plt.show()



        j = []#这个j只是一个命名问题 先不纠结了吧，把问题击中在更加重要的问题上把
        def button_press(event):
            if event.button == 1:  # 点击了鼠标左键
                j.append(0)
                print("点击了鼠标左键")
                print("右键点了，那么全局的self.i有没有变呢?",self.i)
                bder = cv2.copyMakeBorder(read_pic(src, picList[self.i][0]), h, h, h, h, borderType=cv2.BORDER_CONSTANT,
                                          value=[255, 255, 255])
                ax.cla()#清空一下屏幕，现在就空白了图上
                x, y = int(event.xdata), int(event.ydata)
                print("点击之后的x和y分别是:", x, '\t', y)
                x1, y1 = int(x - h / 2), int(y - h / 2)
                x2, y2 = int(x + h / 2), int(y + h / 2)

                #重新读取一下图片作为imgCopy，下面根据他去切片拿到数据
                #imgCopy = read_pic(src, picList[self.i][0])#picList[self.i][0]是file文件名 picList[self.i][1]是矩阵
                #已经又原图了 就从原图上去画吧
                cv2.rectangle(picList[self.i][1], (x1, y1), (x2, y2), (0, 0, 0), 5)
                x1, x2, y1, y2 = x1 + h, x2 + h, y1 + h, y2 + h

                # 在原图上去切片吧    这个是之前超出范围就抛弃的代码
                # xmax, ymax = imgCopy.shape[1], imgCopy.shape[0]
                # x1 = x1 if x1 >= 0 else 0
                # y1 = y1 if y1 >= 0 else 0
                # x2 = x2 if x2 <= xmax else xmax
                # y2 = y2 if y2 <= ymax else ymax

                ball = bder[y1:y2, x1:x2]
                #保存一下图片
                save_pic(ball, des, picList[self.i][0].replace('.', '_' + str(len(j)) + '.'))
                ax.imshow(cv2.cvtColor(picList[self.i][1], cv2.COLOR_BGR2RGB))
                plt.title(picList[self.i][0])
            fig.canvas.draw_idle()

            if event.button == 3:  # 点击了鼠标右键 然后根据这个去更新图片吧
                print("点击了鼠标右键")
                self.i+=1
                print('当前的self.i:', self.i)
                print("整个图片数组的长度:",len(picList))
                #如果self.i==整个图片的数组了，那就是结束了
                if self.i==len(picList):
                    sys.exit()
                #把计数那个j给清空一下
                j.clear()
                ax.cla()  # 清空一下屏幕，现在就空白了图上
                ax.imshow(cv2.cvtColor(picList[self.i][1], cv2.COLOR_BGR2RGB))
            fig.canvas.draw_idle()
        #
        fig.canvas.mpl_disconnect(fig.canvas.manager.key_press_handler_id)  # 取消默认快捷键的注册
        fig.canvas.mpl_connect('button_press_event', button_press)  # 鼠标点击



if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())